#!/bin/bash
#
# /etc/rc.shutdown
#
# Special for Archlive
# 2010.11.16  Carbon Jiao changed base on  initscripts 2010.07-1
#

. /etc/rc.conf
. /etc/rc.d/functions

run_hook shutdown_start

# avoid staircase effect
/bin/stty onlcr

echo " "
if [ "${msg_lang}" = "cn" ]; then
	printhl "初始化关机..."
else
	printhl "Initiating Shutdown..."
fi
echo " "

# avoid NIS hanging syslog-ng on shutdown by unsetting the domainname
if [ -x /bin/domainname ]; then
	/bin/domainname ""
fi

if [ -x /etc/rc.local.shutdown ]; then
	/etc/rc.local.shutdown
fi

# Find daemons NOT in the DAEMONS array. Shut these down first
if [ -d /var/run/daemons ]; then
	for daemon in $(/bin/ls -1t /var/run/daemons); do
		if ! in_array $daemon ${DAEMONS[@]}; then
			stop_daemon $daemon
		fi
	done
fi
# Shutdown daemons in reverse order
let i=${#DAEMONS[@]}-1
while [ $i -ge 0 ]; do
	if [ "${DAEMONS[$i]:0:1}" != '!' ]; then
		ck_daemon ${DAEMONS[$i]#@} || stop_daemon ${DAEMONS[$i]#@}
	fi
	let i=i-1
done

# Terminate all processes
if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在结束 未停止进程..."
else
	stat_busy "Sending SIGTERM To Processes"
fi
run_hook shutdown_prekillall
/sbin/killall5 -15 &> /dev/null
/bin/sleep 5
stat_done

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在杀死 未结束进程..."
else
	stat_busy "Sending SIGKILL To Processes"
fi
/sbin/killall5 -9 &> /dev/null
/bin/sleep 1
stat_done

run_hook shutdown_postkillall

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在保存 随机种子..."
else
	stat_busy "Saving Random Seed"
fi
RANDOM_SEED=/var/lib/misc/random-seed
[ -d $(dirname $RANDOM_SEED) ] || mkdir -p $(dirname $RANDOM_SEED)
: > $RANDOM_SEED
/bin/chmod 0600 $RANDOM_SEED
POOL_FILE=/proc/sys/kernel/random/poolsize
if [ -r $POOL_FILE ]; then
	POOL_SIZE=$(/bin/cat $POOL_FILE)
else
	POOL_SIZE=512
fi
/bin/dd if=/dev/urandom of=$RANDOM_SEED count=1 bs=$POOL_SIZE &> /dev/null
stat_done

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在保存 系统时钟..."
else
	stat_busy "Saving System Clock"
fi
if [ "$TIMEZONE" != "" -a -e "/usr/share/zoneinfo/$TIMEZONE" ]; then
	/bin/rm -f /etc/localtime
	/bin/cp "/usr/share/zoneinfo/$TIMEZONE" /etc/localtime
fi

HWCLOCK_PARAMS="--systohc"
if [ "$HARDWARECLOCK" = "UTC" ]; then
	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc"
elif [ "$HARDWARECLOCK" = "localtime" ]; then
	HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime"
else
	HWCLOCK_PARAMS=""
fi
if [ -n "$HWCLOCK_PARAMS" ]; then
	/sbin/hwclock $HWCLOCK_PARAMS
fi
stat_done

# removing psmouse module to fix some reboot issues on newer laptops
/sbin/modprobe -r psmouse >/dev/null 2>&1

# Write to wtmp file before unmounting
/sbin/halt -w

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在卸载 交换分区..."
else
	stat_busy "Deactivating Swap"
fi
/sbin/swapoff -a
stat_done

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在卸载 文件系统..."
else
	stat_busy "Unmounting Filesystems"
fi
/bin/umount -a -r -t noramfs,notmpfs,nosysfs,noproc -O no_netdev
stat_done

# Kill non-root encrypted partition mappings
if [ -f /etc/crypttab -a -n "$(/bin/grep -v ^# /etc/crypttab | /bin/grep -v ^$)" ]; then
	if [ "${msg_lang}" = "cn" ]; then
		stat_busy "正在卸载 加密卷..."
	else
		stat_busy "Deactivating encrypted volumes:"
	fi
	CS=/sbin/cryptsetup.static
	do_uncrypt() {
		if [ $# -ge 3 ]; then
			if [ -b /dev/mapper/$1 ] ;then
				stat_append "${1}.."
				$CS remove $1 >/dev/null 2>&1
				if [ $? -ne 0 ]; then
					stat_append "failed "
				else
					stat_append "ok "
				fi
			fi
		fi
	}
	while read line; do
		eval do_uncrypt "$line"
	done </etc/crypttab
	stat_done
fi

if [ "$USELVM" = "yes" -o "$USELVM" = "YES" ]; then
	if [ -x /sbin/lvm -a -d /sys/block ]; then
		if [ "${msg_lang}" = "cn" ]; then
			stat_busy "正在卸载 LVM2组..."
		else
			stat_busy "Deactivating LVM2 groups"
		fi
		/sbin/lvm vgchange --ignorelockingfailure -an >/dev/null 2>&1
		stat_done
	fi
fi

if [ "${msg_lang}" = "cn" ]; then
	stat_busy "正在重新 挂载Root分区为只读..."
else
	stat_busy "Remounting Root Filesystem Read-only"
fi
/bin/mount -n -o remount,ro /
stat_done

run_hook shutdown_poweroff

# Power off or reboot
if [ "$RUNLEVEL" = "0" ]; then
	printsep
	if [ "${msg_lang}" = "cn" ]; then
		printhl "${C_H2}关机"
	else
		printhl "${C_H2}POWER OFF"
	fi
	/sbin/poweroff -d -f -h -i
else
	printsep
	if [ "${msg_lang}" = "cn" ]; then
		printhl "${C_H2}重启"
	else
		printhl "${C_H2}REBOOTING"
	fi
	# if kexec is installed and a kernel is loaded, use it
	[ -x /sbin/kexec ] && /sbin/kexec -e > /dev/null 2>&1
	/sbin/reboot -d -f -i
fi

# End of file
# vim: set ts=2 sw=2 noet:
